<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>ECMA测试</title>
  </head>
  <body>
    <script>
      //  1.  Javascript 的数据类型有几种？分别又有哪些类型？（5）
      /*
          8  Number，String，Object，null，undefined，BigInt，Symbol， Boolean
      */
      //  2.  return 有那两个作用？ 构造函数里return会怎么样？（5）

      /*
          终止当前代码执行，返回值 return 后面带的值；

          构造函数里面的return 
          1.后面跟的没有值，则默认返回值是undefined
          2.后面跟着是普通数据类型的值则返回执行构造函数里面的代码，
          3.如果后面跟着是Object类型的值，则返回Object类型的值
      */

      //  3.  undefined 和 null 的区别？什么时候会得到undefined？（5）
      /* 
          null是初始化Object类型初始化对象的，是一个固定内存地址常量

          1.undefined 是定义了但没有赋值的变量的值，
          2.函数里面有return 但后面没有值时，该函数的返回值
          3.提前调用函数但定义函数赋值给变量时
          4.函数没有接收实参的形参的值
          5.查找对象里没有的键值时
      */
      //  4.  使用 continue 或 break 终止循环时，两种方式的区别是？（5）
      /* 
          continue  是终止并跳过本次循环，继续执行下一次循环
          break     是终止循环，不再执行后面的代码，并退出循环
      */
      //  5.  如何判断字符串内是否包含指定字符？（5）
      /* 
          使用included('查找的字符串'，查找的位置)  返回值是true，则有该字符串
          使用indexOf('查找的字符串'，查找的位置)   返回值不是-1，则有该字符串
      */
      //  6. 值传递和引用传递的区别？ （5）
      /* 
          值传递 传递的是参数
          引用传递  传递的是该参数的内存地址
      */
      //  7. 请尽量列举出数组的方法,并注明其作用以及会不会修改原数组，至少10种（10）
      /* 
          能改变：splice，pop，push，unshift，shift,concat,
          不能：join，slice，forEach，find，findindex，every,some,
      */
      //  8.  请写出以下输出的结果和原因；（10）

      var bar = true,
        number = 0;
      console.log(bar + 0); //1 true被隐式转换为数字1
      console.log(bar + 'xyz'); //truexyz true被隐式转换为字符串
      console.log(bar + true); //2  true被隐式转换为数字1
      console.log(+true); //1  true被隐式转换为数字1
      console.log(!'bluej'); //false 字符串（默认为true）取反后变false
      console.log(number++); //0 先把number的值返回为0，再自加1
      console.log(++number); //2 上面自加后number=1，此处先自加1=>number=2后,返回值2
      console.log(number); //2 上面执行后number=2
      10 > 20 || console.log('haha'); //haha  遇到true则返回true的结果
      10 > 20 && console.log('haha'); //false 10>20的结果是false，停止执行后面语句，并返回结果

      //  9. 将多个数组进合并后再去重；对于去重的方案要求3种及以上（10）
      var arr1 = [1, 2, 3],
        arr2 = [2, 3, 4, 5];
      //方案1 先执行拼接，再用new set方法进行去重
      var arrConcat = arr1.concat(arr2); //装拼接的数组
      console.log('方案1', [...new Set(arrConcat)]);

      //方案2 先执行拼接再排序，对拼接数组判断，有重复则删，
      var arrSort = arrConcat.sort((a, b) => a - b); //排序
      for (var i = 0; i < arrSort.length; i++) {
        //判断当前的和下一个是否相等
        if (arrSort[i] === arrSort[i + 1]) {
          //删除
          arrSort.splice(i, 1);
          //解决塌陷
          i--;
        }
      }
      console.log('方案2', arrSort);

      //10.将 str="再见，还会再见吗燕子，再见的时候你要幸福好不好，燕子你要开心，你要幸福，好不好，开心啊，幸福！你的世界以后没有我了，没关系你要幸福，🚗~~ 🏃🏻~~燕子 🧎🏻燕子~~没有你我怎么活啊🚗~~ 🏃🏻~~燕子 🧎🏻燕子~~没有你我怎么活啊🚗~~ 🏃🏻~~燕子 🧎🏻燕子~~没有你我怎么活啊燕子，燕子，燕子，燕子，燕子，燕子，燕子你把我带走吧，燕子！"里面的所有"燕子"替换成"jack"不要用replaceAll(10)
      var str =
        '再见，还会再见吗燕子，再见的时候你要幸福好不好，燕子你要开心，你要幸福，好不好，开心啊，幸福！你的世界以后没有我了，没关系你要幸福，🚗~~ 🏃🏻~~燕子 🧎🏻燕子~~没有你我怎么活啊🚗~~ 🏃🏻~~燕子 🧎🏻燕子~~没有你我怎么活啊🚗~~ 🏃🏻~~燕子 🧎🏻燕子~~没有你我怎么活啊燕子，燕子，燕子，燕子，燕子，燕子，燕子你把我带走吧，燕子！';

      for (var i = 0; i < str.length; i++) {
        if (str.indexOf('燕子', i) !== -1) str = str.replace('燕子', 'jack');
      }
      console.log(str);
      //11. 找出数组中年龄小于18岁的女生(girl)的信息重新组成新的数组,并且将她们count变为现有的平方（10）
      var arr3 = [
        { name: '彭于晏', sex: 'boy', age: 18, count: 20 },
        { name: '迪丽热巴', sex: 'girl', age: 17, count: 30 },
        { name: '吴彦祖', sex: 'boy', age: 16, count: 40 },
        { name: '古力娜扎', sex: 'girl', age: 15, count: 50 },
        { name: '刘德华', sex: 'boy', age: 20, count: 60 },
        { name: '刘亦菲', sex: 'girl', age: 13, count: 70 },
        { name: '张学友', sex: 'boy', age: 14, count: 80 },
      ];
      var newArr3 = arr3
        .filter(function (item) {
          return item.age < 18;
        })
        .map(function (item) {
          return item.count ** 2;
        });
      console.log(newArr3);
      // 12. 统计字符串'abbcccddddd'中每个字符出现的次数，统计数组['a','b','b','c','c','c','d','d','d','d','d'中每个字符出现的次数(10分)
      var arr4 = ['a', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd', 'd', 'd'];
      var arr5 = [];
      var newArr4 = arr4.forEach(function (item, index) {
        if (arr5[item] == undefined) {
          arr5[item] = 1;
        } else {
          arr5[item] += 1;
        }
      });
      console.log('每个字符出现的次数', arr5);
    </script>
  </body>
</html>
